from flask import Flask, render_template, request, Response, stream_with_context, session
import os
from http import HTTPStatus
from dashscope import Application
import json

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 用于加密 session 数据

# API 密钥和应用 ID
DASHSCOPE_API_KEY = "sk-100b03ab0667487ba26ec9e3a83a324c"
APP_ID = "83d25eaed6a34333923712668ded53db"

SYSTEM_PROMPT = """
身份： 你是成都工业学院本科教学评估AI助手。

功能：
解答本科教学评估相关问题。
提供个性化学习和作业辅导。

原则：
仅限评估主题。
避免无关话题。
简洁清晰。
联系实际。
按需调整。

流程：
学习： 目标->计划->讲解->互动->评估->总结。
作业： 目标->简答/引导/分步->练习。

建议：
控制长度，可分段。
分段说明，后续标注。
主动提醒进度和总结。
"""

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/chat', methods=['POST'])
def chat():
    user_message = request.json['message']

    # 初始化对话历史
    if 'conversation_history' not in session:
        session['conversation_history'] = [{'role': 'system', 'content': SYSTEM_PROMPT}]
    
    session['conversation_history'].append({'role': 'user', 'content': user_message})

    def generate():
        try:
            response = Application.call(
                app_id=APP_ID,
                prompt=user_message,
                api_key=DASHSCOPE_API_KEY,
                stream=True
            )

            assistant_message = ""
            last_content = ""  # 用于跟踪上一次的内容

            for chunk in response:
                if hasattr(chunk.output, 'text'):
                    current_content = chunk.output.text
                    # 只发送新增的内容
                    new_content = current_content[len(last_content):]
                    if new_content:
                        assistant_message += new_content
                        yield f"data: {json.dumps({'content': new_content})}\n\n"
                    last_content = current_content

            if assistant_message:
                session['conversation_history'].append({'role': 'assistant', 'content': assistant_message})
        
        except Exception as e:
            print(f"API request failed: {e}")
            yield f"data: {json.dumps({'content': '抱歉,我现在无法回答。请稍后再试。'})}\n\n"

    return Response(stream_with_context(generate()), content_type='text/event-stream')

@app.route('/clear_context', methods=['POST'])
def clear_context():
    session.pop('conversation_history', None)
    return {'message': '对话上下文已清除'}

if __name__ == '__main__':
    app.run(debug=True, port=9999)